package view;

import java.awt.Color;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JLabel;

import core.jogadores.JogadorAleatorio;
import core.jogadores.JogadorMutanteArvore;
import core.jogo.Tabuleiro;
import core.redeNeural.RedeNeural;
import core.redeNeural.RedeTipo2;
import core.redeNeural.Serializador;

public class Janela extends JFrame{

	private TabuleiroView tabuleiro;
	private Jogador jogadorMutante , adversario;
	private final int NEGRAS = 0, VERMELHAS = 1;
	private int turno = NEGRAS;

	public static void main(String args[]){
		Janela janela;
		janela = new Janela(new TabuleiroView());
	}

	public Janela(TabuleiroView tabuleiro){
		this.setBounds(0,0,900,700);
		this.setLocationRelativeTo(null);
		this.tabuleiro = tabuleiro;		
		JDesktopPane desktop = new JDesktopPane();
		this.add(desktop);
		tabuleiro.setBounds(0,0,700,700);
		desktop.add(tabuleiro);
		desktop.setBackground(Color.LIGHT_GRAY);
		inicializarControles(desktop);			
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		inicializaJogadores();
		this.setVisible(true);
	}

	private void inicializaJogadores() {

		java.util.List<String> redes1 = Serializador.recuperarPopulacao("/home/guilherme/populacoes/poptipo2-1-ply-920-3-ply972");

		adversario = new JogadorAleatorio();
		jogadorMutante = new JogadorMutanteArvore(new RedeTipo2(redes1.get(19)),2);
	}

	private void inicializarControles(JDesktopPane desktop) {
		JButton realizarJogada, novoJogo;
		JLabel proxJogador;
		final JLabel vencedor, nomeVencedor;
		final List jogadores = new List(2,false);

		vencedor = new JLabel();
		vencedor.setBounds(710, 170, 150, 30);
		vencedor.setText("Vencedor:");
		vencedor.setVisible(false);
		nomeVencedor = new JLabel();
		nomeVencedor.setBounds(710, 200, 150, 30);
		nomeVencedor.setVisible(false);


		realizarJogada = new JButton("Realizar Jogada");
		realizarJogada.setBounds(710,10,150,30);
		realizarJogada.addActionListener(new ActionListener(){

			
			public void actionPerformed(ActionEvent arg0) {
				int[] tabuleiroCorrente = null, proximaJogada = null;
				if(getTurno() == VERMELHAS)
					tabuleiroCorrente = inverterTabuleiro(getTabuleiro().getCasas());
				else
					tabuleiroCorrente = getTabuleiro().getCasas();
				long tempoInicial = System.currentTimeMillis();
				switch (jogadores.getSelectedIndex()) {
				case 0:
					proximaJogada = jogadorMutante.jogar(tabuleiroCorrente);
					System.out.println(System.currentTimeMillis() - tempoInicial);
					break;
				case 1:
					proximaJogada = adversario.jogar(tabuleiroCorrente);
					System.out.println(System.currentTimeMillis() - tempoInicial);
					break;
				}
				if(proximaJogada != null){
					if(isValida(tabuleiroCorrente, proximaJogada)){
						if(getTurno() == VERMELHAS)
							proximaJogada = inverterTabuleiro(proximaJogada);
						getTabuleiro().setCasas(proximaJogada);
						getTabuleiro().repaint();
					}
					jogadores.select(proximoJogador());
					if(getTurno() == VERMELHAS)
						setTurno(NEGRAS);
					else
						setTurno(VERMELHAS);
				}
				else{
					nomeVencedor.setText(jogadores.getItem(proximoJogador()));
					nomeVencedor.setVisible(true);
					vencedor.setVisible(true);
					vencedor.repaint();
					nomeVencedor.repaint();
				}
			}

			private int proximoJogador() {
				if(jogadores.getSelectedIndex() == 0)
					return 1;
				else 
					return 0;
			}

			private int[] inverterTabuleiro(int[] casas) {
				Tabuleiro tab = new Tabuleiro();
				tab.setCasas(casas);
				return tab.inverter().getCasas();				
			}

			private boolean isValida(int[] casas, int[] casas2) {
				// TODO Verificar se haverá uma camada validadora
				return true;
			}			
		});

		proxJogador = new JLabel("Próximo Jogador:");
		proxJogador.setBounds(710,40,150,30);		

		jogadores.add("Wolverine",0);
		jogadores.add("Gambit",1);
		jogadores.setBounds(710,70,150,47);
		jogadores.select(1);

		novoJogo = new JButton("Novo Jogo");
		novoJogo.setBounds(710,130,150,30);
		novoJogo.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				vencedor.setVisible(false);
				nomeVencedor.setVisible(false);
				getTabuleiro().novoJogo();
				setTurno(NEGRAS);
			}			

		});

		desktop.add(jogadores);
		desktop.add(proxJogador);
		desktop.add(realizarJogada);
		desktop.add(novoJogo);
		desktop.add(vencedor);
		desktop.add(nomeVencedor);
	}

	public TabuleiroView getTabuleiro() {
		return tabuleiro;
	}

	public void setTabuleiro(TabuleiroView tabuleiro) {
		this.tabuleiro = tabuleiro;
	}

	public int getTurno() {
		return turno;
	}

	public void setTurno(int turno) {
		this.turno = turno;
	}


}
